/**
 * 
 */
package beans;


import javax.faces.context.FacesContext;

import javax.el.ValueExpression;
import javax.faces.component.html.HtmlDataTable;
import javax.faces.component.html.HtmlColumn;
import javax.faces.component.html.HtmlOutputText;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.Image;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfWriter;

import java.awt.Color;
import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;

import dao.DAO;
import dao.DAOGenerico;
import logica.RolEmpleado;
import logica.Usuario;

/**
 * @author ALEJA CHICA
 *
 */
public class UsuarioBean 
{

	Usuario usuario;
	
	private String login;
	private String password;
	private RolEmpleado rolEmpleado;
	private Long cedula;
	private String nombre;
	private int codigoRol;
	private List<Usuario> usuarios;

	public List<Usuario> getUsuarios() {
		return usuarios;
	}

	public void setUsuarios(List<Usuario> usuarios) {
		this.usuarios = usuarios;
	}

	public Usuario getUsuario() 
	{
		listarPersonas();
		return usuario;
	}

	public void setUsuario(Usuario usuario) 
	{
		this.usuario = usuario;
	}

	public int getCodigoRol() {
		return codigoRol;
	}

	public void setCodigoRol(int codigoRol) {
		BigDecimal codigoRolBD = BigDecimal.valueOf((double)codigoRol);
		DAOGenerico<RolEmpleado> daoRol = null;
		switch (codigoRol){
			case 1:
				daoRol = new DAOGenerico<RolEmpleado>(RolEmpleado.class);
				rolEmpleado = daoRol.findById(codigoRolBD);
				break;
			case 2:
				daoRol = new DAOGenerico<RolEmpleado>(RolEmpleado.class);
				rolEmpleado = daoRol.findById(codigoRolBD);
				break;
			case 3:
				daoRol = new DAOGenerico<RolEmpleado>(RolEmpleado.class);
				rolEmpleado = daoRol.findById(codigoRolBD);
				break;
			default:
//				TODO no debe pasar
				;
		}
		this.codigoRol = codigoRol;
	}

	public String getLogin() {
		return this.login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getPassword() {
		return this.password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public RolEmpleado getRolEmpleado() {
		return this.rolEmpleado;
	}

	public void setRolEmpleado(RolEmpleado rolEmpleado) {
		this.rolEmpleado = rolEmpleado;
	}

	public Long getCedula() {
		return this.cedula;
	}

	public void setCedula(Long cedula) {
		this.cedula = cedula;
	}

	public String getNombre() {
		return this.nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	
	public String insertarPersona()
	{
		
		try
		{
			DAO<Usuario> daoUsuario = new DAOGenerico<Usuario>(Usuario.class);
			Usuario usuario = new Usuario();
			
			usuario.setLogin(this.getLogin());
			usuario.setPassword(this.getPassword());
			usuario.setCedula(this.getCedula());
			usuario.setRolEmpleado(this.rolEmpleado);
			usuario.setNombre(this.getNombre());
			daoUsuario.persist(usuario);
			
			return "usu";
		}
		catch (Exception e)
		{
			return "no";
		}
		
	}
	
	public String modificarPersona()
	{

		try
		{
			DAO<Usuario> daoUsuario = new DAOGenerico<Usuario>(Usuario.class);
			Usuario usuario = new Usuario();
			
			usuario.setLogin(this.getLogin());
			usuario.setPassword(this.getPassword());
			usuario.setCedula(this.getCedula());
			usuario.setRolEmpleado(this.rolEmpleado);
			usuario.setNombre(this.getNombre());
			daoUsuario.merge(usuario);
			
			return "usu";
		}
		catch (Exception e)
		{
			return "no";
		}
		
	}
	
	public String elminarPersona()
	{
		
		try
		{
			DAO<Usuario> daoUsuario = new DAOGenerico<Usuario>(Usuario.class);
			Usuario usuario = new Usuario();
			
			usuario.setLogin(this.getLogin());
			usuario.setPassword(this.getPassword());
			usuario.setCedula(this.getCedula());
			usuario.setRolEmpleado(this.rolEmpleado);
			usuario.setNombre(this.getNombre());
			daoUsuario.delete(usuario);
			
			return "usu";
		}
		catch (Exception e)
		{
			return "no";
		}
		
	}
	
	

	private List<Usuario> listarPersona() 
	{
		
		DAO<Usuario> daoUsuario = new DAOGenerico<Usuario>(Usuario.class);
		Usuario usuario = new Usuario();
		
		return  daoUsuario.findByExample(usuario);
	}
	
	public String listarPersonas()
	{
		usuarios = listarPersona();

		return "no";
	}
	
	private HtmlDataTable datos;

	public HtmlDataTable getDatos() 
	{
		poblarDataTable();
		return datos;
	}

	public void setDatos(HtmlDataTable datos) 
	{
		this.datos = datos;
	}
	
	private void poblarDataTable()
	{

		datos = new HtmlDataTable();
		datos.setValueExpression("value", createValueExpression("#{myBean.dataList}", List.class));
		datos.setVar("item");
		datos.setBgcolor("silver");		
		datos.setStyle("color1");
		
		HtmlColumn loginColumn = new HtmlColumn();
		datos.getChildren().add(loginColumn);

		// Create <h:outputText value="#{dataItem.name}"> for the body of 'Name'
		// column.
		HtmlOutputText loginOutput = new HtmlOutputText();
		loginOutput.setValueExpression("value", createValueExpression("#{item.login}", String.class));
		loginColumn.getChildren().add(loginOutput);
//		// Create <h:column> for 'Value' column.
//		HtmlColumn codidoRolColumn = new HtmlColumn();
//		datos.getChildren().add(codidoRolColumn);
//
//		
//		// Create <h:outputText value="#{dataItem.value}"> for the body of
//		// 'Value' column.
//		HtmlOutputText nameOutput = new HtmlOutputText();
//		nameOutput.setValueExpression("value", createValueExpression("#{item.codidoRol}", Integer.class));
//		codidoRolColumn.getChildren().add(nameOutput);
		
		HtmlColumn nombreColumn = new HtmlColumn();
		datos.getChildren().add(nombreColumn);
		
		HtmlOutputText cedulaOutput = new HtmlOutputText();
		cedulaOutput.setValueExpression("value", createValueExpression("#{item.nombre}", String.class));
		nombreColumn.getChildren().add(cedulaOutput);
		
		HtmlColumn cedulaColumn = new HtmlColumn();
		datos.getChildren().add(cedulaColumn);
		
		HtmlOutputText rolOutput = new HtmlOutputText();
		rolOutput.setValueExpression("value", createValueExpression("#{item.cedula}", Long.class));
		cedulaColumn.getChildren().add(rolOutput);

	}
	
	private ValueExpression createValueExpression(String valueExpression,Class<?> valueType)
	{
		FacesContext facesContext = FacesContext.getCurrentInstance();
		
		return facesContext.getApplication().getExpressionFactory().createValueExpression(facesContext.getELContext(),valueExpression, valueType);
	}
	
	
	/*
	 * 
	 */

	
	public  String generarReporte() 
	{
		
		// step 1: creation of a document-object
		Document document = new Document();
		try {
			// step 2:
			// we create a writer
			PdfWriter.getInstance(
			// that listens to the document
					document,
					// and directs a PDF-stream to a file
					new FileOutputStream("Reporte1.pdf"));
			
			Font font=new Font(Font.COURIER, 16, Font.BOLDITALIC, Color.blue);
			
			// step 3: we open the document
			document.open();
			  Image img=Image.getInstance("images\\logo.jpg");
	          img.setAlignment(Image.ALIGN_CENTER);
	          document.add(img);
			
			// step 4: we add a table to the document
			  
	          
	          
	          
			PdfPTable table = new PdfPTable(3);
			PdfPCell cell = new PdfPCell(new Paragraph("Reporte de los usuarios del sistema.",font));
			cell.setColspan(5);

			table.addCell(cell);

						
			for(int i=0;i< 1;i++)
			{
				table.addCell("Login");
				table.addCell("Cedula");
				table.addCell("Nombre");
			}
			
			
			String resu="",resu2="";
			Long resu1=0L;
	    	
	    	for(int i=0; i<usuarios.size(); i++)
	    	{
	    		resu=usuarios.get(i).getLogin();
	    		table.addCell(resu);
	    		
	    		resu1=usuarios.get(i).getCedula();
	    		table.addCell(resu1+"");
	    		
	    		resu2=usuarios.get(i).getNombre();
	    		table.addCell(resu2);
	    		
	    		System.out.println("a"+resu);
	    	}
			
			document.add(table);
			
		} catch (DocumentException de) {
			System.err.println(de.getMessage());
		} catch (IOException ioe) {
			System.err.println(ioe.getMessage());
		}

		// step 5: we close the document
		document.close();
		
		Desktop d = Desktop.getDesktop();
        if(Desktop.isDesktopSupported())
        {
            
           try 
           {
        	   d.open(new File("Reporte1.pdf"));
		   } 
           catch (IOException ex) 
           {					
        	   ex.printStackTrace();
           }
        }
		return "";
	}
	
	
}
